define(["jquery", "bootstrap", "backend", "table", "form"], function ($, undefined, Backend, Table, Form) {
  var Controller = {
    index: function () {
      $(document).ready(function () {
        var resData = null; // 查询季度统计 服务器返回数据
        var quarterInput = null; // 季度
        let loading = layer.load();
        // 选择所有 class 为 table-row 的行，并为偶数行添加 class="info"
        $(".table-row:even").addClass("info");

        // 病区敏感
        var areaDataQuarter = {
          住院患者实际占用床日数: Array(25).fill("-"),
          新入院患者总数: Array(25).fill("-"),
          白班责任护士数: Array(25).fill("-"),
          白班护理患者数: Array(25).fill("-"),
          夜班责任护士数: Array(25).fill("-"),
          夜班护理患者数: Array(25).fill("-"),
          护士上班小时数: Array(25).fill("-"),
          导尿管留置日数: Array(25).fill("-"),
          胃肠管留置日数: Array(25).fill("-"),
          气管导管留置日数: Array(25).fill("-"),
          CVC留置日数: Array(25).fill("-"),
          PICC留置日数: Array(25).fill("-"),
          身体约束日数: Array(25).fill("-"),
          特级护理患者占用床日数: Array(25).fill("-"),
          一级护理患者占用床日数: Array(25).fill("-"),
          二级护理患者占用床日数: Array(25).fill("-"),
          三级护理患者占用床日数: Array(25).fill("-"),
        };

        // 职称相关
        var jobTitleQuarter = {
          季初护士职称人数: Array(25).fill("-"),
          季末护士职称人数: Array(25).fill("-"),
          季初护师人数: Array(25).fill("-"),
          季末护师职称人数: Array(25).fill("-"),
          季初主管护师职称人数: Array(25).fill("-"),
          季末主管护师职称人数: Array(25).fill("-"),
          季初副主任护师职称人数: Array(25).fill("-"),
          季末副主任护师职称人数: Array(25).fill("-"),
          季初主任护师职称人数: Array(25).fill("-"),
          季末主任护师职称人数: Array(25).fill("-"),
          季末各职称总职称人数: Array(25).fill("-"),
        };

        // 学历相关
        var educationBakQuarter = {
          季初中专人数: Array(25).fill("-"),
          季末中专人数: Array(25).fill("-"),
          季初大专人数: Array(25).fill("-"),
          季末大专人数: Array(25).fill("-"),
          季初本科人数: Array(25).fill("-"),
          季末本科人数: Array(25).fill("-"),
          季初硕士人数: Array(25).fill("-"),
          季末硕士人数: Array(25).fill("-"),
          季初博士人数: Array(25).fill("-"),
          季末博士人数: Array(25).fill("-"),
          季末各学历总人数: Array(25).fill("-"),
        };

        // 工作年限相关
        var yearPayQuarter = {
          "季初<1年资人数": Array(25).fill("-"),
          "季末<1年资人数": Array(25).fill("-"),
          "季初1≤y<2年资人数": Array(25).fill("-"),
          "季末1≤y<2年资人数": Array(25).fill("-"),
          "季初2≤y<5年资人数": Array(25).fill("-"),
          "季末2≤y<5年资人数": Array(25).fill("-"),
          "季初5≤y<10年资人数": Array(25).fill("-"),
          "季末5≤y<10年资人数": Array(25).fill("-"),
          "季初10≤y<20年资人数": Array(25).fill("-"),
          "季末10≤y<20年资人数": Array(25).fill("-"),
          "季初≥20年资人数": Array(25).fill("-"),
          "季末≥20年资人数": Array(25).fill("-"),
          季末各工作年限总人数: Array(25).fill("-"),
          // 离职总人数: Array(25).fill("-"),
        };

        // 各科室指标 数据对象
        var departTargetQuarter = {
          实际开放床数: Array(25).fill("-"),
          初全院执业护士总人数: Array(25).fill("-"),
          末全院执业护士总人数: Array(25).fill("-"),
          初病区执业护士总人数: Array(25).fill("-"),
          末病区执业护士总人数: Array(25).fill("-"),
          岗执业护士上班小时数: Array(25).fill("-"),
          导尿管拔管发生例次数: Array(25).fill("-"),
          胃肠管拔管发生例次数: Array(25).fill("-"),
          中心导管拔管发生例次数: Array(25).fill("-"),
          气管导管拔管发生例次数: Array(25).fill("-"),
          VAP发生例次数: Array(25).fill("-"),
          CLABSI发生例次数: Array(25).fill("-"),
          CAUTI发生例次数: Array(25).fill("-"),
          有创机械通气的总日数: Array(25).fill("-"),
          住院患者身体约束日数: Array(25).fill("-"),
          II期及以上压疮发生例数: Array(25).fill("-"),
          I期压疮发生例数: Array(25).fill("-"),
          跌倒发生例次数: Array(25).fill("-"),
          跌倒伤害严重度1级例次数: Array(25).fill("-"),
          跌倒伤害严重度2级例次数: Array(25).fill("-"),
          跌倒伤害严重度3级例次数: Array(25).fill("-"),
          跌倒死亡例次数: Array(25).fill("-"),
          跌倒伤害总例次数: Array(25).fill("-"),
        };

        const departments = [
          "ICU",
          "外科",
          "胸外",
          "乳一",
          "乳二",
          "妇科",
          "内一",
          "内二",
          "放一",
          "放二",
          "放三",
          "结一",
          "结二",
          "结三",
          "放射科",
          "供应室",
          "ECT",
          "配液",
          "窥镜",
          "结门",
          "门诊",
          "手术室",
          "功能科",
          "护理部",
        ];

        // var tableDataInit = JSON.parse(JSON.stringify(tableData));

        /**
         * ************** 各科室指标数据板块
         */
        tableAddFun(departTargetQuarter, "#departTargetTable", false, true); // 各科室指标 表格

        /**
         * ************** 病区敏感数据板块
         */
        tableAddFun(areaDataQuarter, "#areaDataTable", false, true); // 病区敏感数据 表格

        /**
         * ************** 护士板块
         */
        tableAddFun(jobTitleQuarter, "#JobTitleTable", true, true); // 创建护士 职称 表格
        tableAddFun(educationBakQuarter, "#EducationBackTable", true, true); // 创建护士 学历 表格
        tableAddFun(yearPayQuarter, "#YearPayTable", true, true); // 创建护士 年金 表格

        layer.close(loading);

        // *********************************************************************************************
        // ***************************************** 初始化完成 *****************************************
        // *********************************************************************************************

        // 确定按钮 点击事件
        $("#submit-btn").click(function (event) {
          event.preventDefault(); // 阻止表单的默认提交行为
          var quarter_select = $("#quarter-select").val();
          quarterInput = quarter_select;
          // 判断季度是否为空, 为空则提示
          if (quarter_select == "") {
            layer.alert("请选择季度", { icon: 2, time: 3000 });
            return false;
          }

          let loading = layer.load();

          // ajax 请求数据
          $.ajax({
            url: "fssy/Hospitalcount/getHospitalAllCountData",
            type: "POST",
            data: {
              quarter_select, // 季度
            },
            success: function (res) {
              console.log("success = ", res);
              res.msg = "OK" ? layer.alert("查询成功", { icon: 1 }) : layer.alert("查询失败", { icon: 2 });
              reAreaData = res.data.areaData;
              resNurseData = res.data.nurseData;
              resDepartData = res.data.departData;
              resData = res.data; // 保存查询结果数据

              // 表格选择器数组
              const tableSelectors = ["#departTargetTable", "#areaDataTable", "#JobTitleTable", "#EducationBackTable", "#YearPayTable"];
              // 清空表格
              tableSelectors.forEach((selector) => $(selector + " tbody").empty());

              departTargetQuarter = departTargetQuarterFun(resDepartData, departments);
              areaDataQuarter = areaDataQuarterFun(reAreaData, departments, areaDataQuarter);
              jobTitleQuarter = nurseJobTitleQuarterFun(resNurseData, departments);
              educationBakQuarter = nurseEducationBakQuarterFun(resNurseData, departments);
              yearPayQuarter = nurseYearPayQuarterFun(resNurseData, departments);

              tableAddFun(departTargetQuarter, "#departTargetTable", false, true); // 各科室指标 表格
              tableAddFun(areaDataQuarter, "#areaDataTable", false, true); // 病区敏感数据 表格
              tableAddFun(jobTitleQuarter, "#JobTitleTable", true, true); // 创建护士 职称 表格
              tableAddFun(educationBakQuarter, "#EducationBackTable", true, true); // 创建护士 学历 表格
              tableAddFun(yearPayQuarter, "#YearPayTable", true, true); // 创建护士 年金 表格

              layer.close(loading);
            },
            error: function (jqXHR, textStatus, errorThrown) {
              console.log(textStatus, errorThrown);
            },
          });
        });

        $("#test-btn").on("click", function (event) {
          event.preventDefault(); // 阻止表单的默认提交行为
          let quarter_select = $("#quarter-select").val();
          // ajax 请求数据
          $.ajax({
            url: "fssy/Hospitalcount/getDepartTricsCountDataFun",
            type: "POST",
            data: { quarter_select },
            success: function (res) {
              console.log("success = ", res);
              res = res.data;
              // 调用 aggregateDepartmentData 函数处理数据
              const departTargetQuarter = departTargetQuarterFun(res, departments);
              console.log("aggregatedData = ", aggregatedData);
            },
            error: function (jqXHR, textStatus, errorThrown) {
              console.log(textStatus, errorThrown);
            },
          });
        });

        // 导出excel按钮 #output-excel-btn 点击事件 ajax 请求数据
        // $("#export-btn").on("click", function (event) {
        //   event.preventDefault(); // 阻止表单的默认提交行为

        //   if (resData == null) {
        //     layer.alert("请先查询数据后,方可导出Excel文件", { icon: 2, time: 3000 });
        //     return false;
        //   }
        //   console.log("resData = ", resData);
        //   // 拼接请求的 URL 并触发文件下载
        //   const form = $("<form>").attr("style", "display:none").attr("method", "POST").attr("action", "hospitalcount/outputExcel");
        //   // 将表单添加到页面并提交
        //   $("body").append(form);
        //   form.submit();
        //   form.remove();
        // });
        $("#export-btn").on("click", function (event) {
          event.preventDefault(); // 阻止表单的默认提交行为

          if (resData == null) {
            layer.alert("请先查询数据后,方可导出Excel文件", { icon: 2, time: 3000 });
            return false;
          }

          let quarter_select = $("#quarter-select").val();
          let loading = layer.load();

          let dataList = [{ departTargetQuarter: departTargetQuarter }];
          let dataObj = { departTargetQuarter, quarter_select, areaDataQuarter, jobTitleQuarter, educationBakQuarter, yearPayQuarter };

          // 发起导出请求
          $.ajax({
            url: "fssy/hospitalcount/outputExcel",
            method: "POST",
            contentType: "application/json",
            data: JSON.stringify(dataObj), // 传递查询数据
            // data: dataList, // 传递查询数据
            success: function (response) {
              console.log("导出数据 第一请求 = ", response);
              if (response.code === 1) {
                const fileToken = response.data.fileToken;
                console.log("文件生成成功，标识符:", fileToken);

                // 启动轮询获取文件生成状态
                const checkInterval = setInterval(() => {
                  $.ajax({
                    url: "fssy/hospitalcount/checkExportStatus",
                    method: "GET",
                    data: { fileToken: fileToken },
                    success: function (statusResponse) {
                      if (statusResponse.code === 1 && statusResponse.data.ready) {
                        clearInterval(checkInterval); // 停止轮询
                        console.log("文件已准备好");

                        // 提供下载链接
                        const downloadUrl = "hospitalcount/downloadExcel?fileToken=" + fileToken;
                        window.location.href = downloadUrl;
                        layer.close(loading);
                        layer.alert("文件导出成功! 请点击保留或另存为下载", { icon: 1, time: 3000 });
                      }
                    },
                    error: function () {
                      clearInterval(checkInterval);
                      layer.close(loading);
                      layer.alert("文件生成失败，请稍后重试", { icon: 2, time: 3000 });
                    },
                  });
                }, 2000); // 每隔2秒轮询一次
              } else {
                layer.close(loading);
                layer.alert(response.msg, { icon: 2, time: 3000 });
              }
            },
            error: function () {
              layer.close(loading);
              layer.alert("导出请求失败，请稍后重试", { icon: 2, time: 3000 });
            },
          });
        });
      });
      // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 函数 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      // 护士 ***职称*** 按各个科室 统计 函数
      function nurseJobTitleQuarterFun(data, departments) {
        // 初始化表格数据
        var jobTitleQuarter = {
          季初护士职称人数: Array(25).fill(0),
          季末护士职称人数: Array(25).fill(0),
          季初护师人数: Array(25).fill(0),
          季末护师职称人数: Array(25).fill(0),
          季初主管护师职称人数: Array(25).fill(0),
          季末主管护师职称人数: Array(25).fill(0),
          季初副主任护师职称人数: Array(25).fill(0),
          季末副主任护师职称人数: Array(25).fill(0),
          季初主任护师职称人数: Array(25).fill(0),
          季末主任护师职称人数: Array(25).fill(0),
          季末各职称总职称人数: Array(25).fill(0),
        };

        // 遍历每个科室
        departments.forEach((department, index) => {
          if (data[department]) {
            const checkedData = data[department].CheckedData.jobTitleQuarter;
            const previousData = data[department].PriviousData.jobTitleQuarter;

            // 根据每个科室的数据更新表格
            jobTitleQuarter["季初护士职称人数"][index] = previousData["护士"] || 0;
            jobTitleQuarter["季末护士职称人数"][index] = checkedData["护士"] || 0;

            jobTitleQuarter["季初护师人数"][index] = previousData["护师"] || 0;
            jobTitleQuarter["季末护师职称人数"][index] = checkedData["护师"] || 0;

            jobTitleQuarter["季初主管护师职称人数"][index] = previousData["主管护师"] || 0;
            jobTitleQuarter["季末主管护师职称人数"][index] = checkedData["主管护师"] || 0;

            jobTitleQuarter["季初副主任护师职称人数"][index] = previousData["副主任护师"] || 0;
            jobTitleQuarter["季末副主任护师职称人数"][index] = checkedData["副主任护师"] || 0;

            jobTitleQuarter["季初主任护师职称人数"][index] = previousData["主任护师"] || 0;
            jobTitleQuarter["季末主任护师职称人数"][index] = checkedData["主任护师"] || 0;

            // 计算季末各职称总职称人数
            jobTitleQuarter["季末各职称总职称人数"][index] =
              (checkedData["护士"] || 0) +
              (checkedData["护师"] || 0) +
              (checkedData["主管护师"] || 0) +
              (checkedData["副主任护师"] || 0) +
              (checkedData["主任护师"] || 0);
          }
        });

        // 遍历 jobTitleQuarter  更新总人数
        Object.entries(jobTitleQuarter).forEach(([key, value]) => {
          let sum = 0;
          value.forEach((item, index) => {
            sum += item;
          });
          value[value.length - 1] = sum;
        });

        return jobTitleQuarter;
      }

      // 护士 ***学历*** 按各个科室 统计 函数
      function nurseEducationBakQuarterFun(data, departs) {
        const educationLevels = ["中专", "大专", "本科", "硕士", "博士"];
        let departments = departs;
        const educationBakQuarter = {
          季初中专人数: Array(departments.length).fill(0),
          季末中专人数: Array(departments.length).fill(0),
          季初大专人数: Array(departments.length).fill(0),
          季末大专人数: Array(departments.length).fill(0),
          季初本科人数: Array(departments.length).fill(0),
          季末本科人数: Array(departments.length).fill(0),
          季初硕士人数: Array(departments.length).fill(0),
          季末硕士人数: Array(departments.length).fill(0),
          季初博士人数: Array(departments.length).fill(0),
          季末博士人数: Array(departments.length).fill(0),
          季末各学历总人数: Array(departments.length).fill(0),
        };

        // 遍历每个科室和学历
        departments.forEach((department, index) => {
          let totalEndEducation = 0;

          educationLevels.forEach((level) => {
            const initial = data[department]?.PriviousData?.educationBakQuarter?.[level] || 0;
            const end = data[department]?.CheckedData?.educationBakQuarter?.[level] || 0;

            educationBakQuarter[`季初${level}人数`][index] = initial;
            educationBakQuarter[`季末${level}人数`][index] = end;

            totalEndEducation += end;
          });

          educationBakQuarter["季末各学历总人数"][index] = totalEndEducation;
        });

        // 添加“总计”列
        Object.keys(educationBakQuarter).forEach((key) => {
          const row = educationBakQuarter[key];
          const total = row.reduce((sum, value) => sum + (parseInt(value, 10) || 0), 0);
          row.push(total);
        });

        return educationBakQuarter;
      }

      // 护士 ***年金*** 按各个科室 统计 函数
      function nurseYearPayQuarterFun(data, departments) {
        const quarters = ["季初", "季末"];
        const payRanges = ["<1年资人数", "1≤y<2年资人数", "2≤y<5年资人数", "5≤y<10年资人数", "10≥y<20年资人数", "≥20年资人数"];

        // 定义输出对象的结构和顺序
        const yearPayQuarterKeys = [];
        quarters.forEach((quarter) => {
          payRanges.forEach((payRange) => {
            yearPayQuarterKeys.push(`${quarter}${payRange}`);
          });
        });
        yearPayQuarterKeys.push("季末各工作年限总人数");

        // 初始化yearPayQuarter对象，所有值初始为"-"组成的数组
        const yearPayQuarter = {};
        yearPayQuarterKeys.forEach((key) => {
          yearPayQuarter[key] = Array(departments.length + 1).fill("-");
        });

        // 收集数据并填充yearPayQuarter，并为每个科室的每个年资范围计算总和
        quarters.forEach((quarter, qIndex) => {
          payRanges.forEach((payRange) => {
            const key = `${quarter}${payRange}`;
            let sum = 0;

            departments.forEach((department, index) => {
              if (data[department]) {
                const quarterDataKey = qIndex === 0 ? "PriviousData" : "CheckedData";
                const value = data[department][quarterDataKey].yearPayQuarter[payRange] || 0;
                yearPayQuarter[key][index] = value;
                sum += value;
              }
            });

            // 将总和添加到结果数组末尾
            yearPayQuarter[key][departments.length] = sum;
          });
        });

        // 计算“季末各工作年限总人数”，即每个科室在所有年资范围的季末人数总和
        const endOfQuarterTotal = [];
        for (let i = 0; i < departments.length; i++) {
          let sum = 0;
          payRanges.forEach((payRange) => {
            const key = `季末${payRange}`;
            sum += parseInt(yearPayQuarter[key][i], 10) || 0; // 累加每个科室在所有年资范围的季末人数
          });
          endOfQuarterTotal.push(sum); // 将总和添加到结果数组中
        }

        // 计算“季末各工作年限总人数”的总和
        const totalSum = endOfQuarterTotal.reduce((acc, curr) => acc + curr, 0);
        endOfQuarterTotal.push(totalSum);

        // 更新“季末各工作年限总人数”属性
        yearPayQuarter["季末各工作年限总人数"] = endOfQuarterTotal;

        let obj = {};
        obj["季初<1年资人数"] = yearPayQuarter["季初<1年资人数"];
        obj["季末<1年资人数"] = yearPayQuarter["季末<1年资人数"];
        obj["季初1≤y<2年资人数"] = yearPayQuarter["季初1≤y<2年资人数"];
        obj["季末1≤y<2年资人数"] = yearPayQuarter["季末1≤y<2年资人数"];
        obj["季初2≤y<5年资人数"] = yearPayQuarter["季初2≤y<5年资人数"];
        obj["季末2≤y<5年资人数"] = yearPayQuarter["季末2≤y<5年资人数"];
        obj["季初5≤y<10年资人数"] = yearPayQuarter["季初5≤y<10年资人数"];
        obj["季末5≤y<10年资人数"] = yearPayQuarter["季末5≤y<10年资人数"];
        obj["季初10≥y<20年资人数"] = yearPayQuarter["季初10≥y<20年资人数"];
        obj["季末10≥y<20年资人数"] = yearPayQuarter["季末10≥y<20年资人数"];
        obj["季初≥20年资人数"] = yearPayQuarter["季初≥20年资人数"];
        obj["季末≥20年资人数"] = yearPayQuarter["季末≥20年资人数"];
        obj["季末各工作年限总人数"] = yearPayQuarter["季末各工作年限总人数"];

        // 打印每个年资范围的总和
        // console.log("Year Pay Quarter Summary:", obj);
        return obj;
      }

      // 病区 ***敏感数据*** 按各个科室 统计 函数
      function areaDataQuarterFun(data, departments, areaDataQuarter) {
        // 创建一个新的对象来存储结果
        const transformedData = {};

        // 遍历原始数据中的每个科室
        for (const departmentKey in data) {
          if (Array.isArray(data[departmentKey])) {
            // 初始化科室汇总对象
            const departmentSMU = {
              actual_bed_days: 0,
              new_admissions_count: 0,
              day_shift_nurses: 0,
              day_shift_patients: 0,
              night_shift_nurses: 0,
              night_shift_patients: 0,
              nurse_work_hours: 0,
              catheter_days: 0,
              astro_tube_days: 0,
              trachea_tube_days: 0,
              cvc_days: 0,
              picc_days: 0,
              restraint_days: 0,
              special_care_bed_days: 0,
              level_1_bed_days: 0,
              level_2_bed_days: 0,
              level_3_bed_days: 0,
            };

            // 累加每个科室的数据
            data[departmentKey].forEach((department) => {
              departmentSMU.actual_bed_days += department.actual_bed_days;
              departmentSMU.new_admissions_count += department.new_admissions_count;
              departmentSMU.day_shift_nurses += department.day_shift_nurses;
              departmentSMU.day_shift_patients += department.day_shift_patients;
              departmentSMU.night_shift_nurses += department.night_shift_nurses;
              departmentSMU.night_shift_patients += department.night_shift_patients;
              departmentSMU.nurse_work_hours += department.nurse_work_hours;
              departmentSMU.catheter_days += department.catheter_days;
              departmentSMU.astro_tube_days += department.astro_tube_days;
              departmentSMU.trachea_tube_days += department.trachea_tube_days;
              departmentSMU.cvc_days += department.cvc_days;
              departmentSMU.picc_days += department.picc_days;
              departmentSMU.restraint_days += department.restraint_days;
              departmentSMU.special_care_bed_days += department.special_care_bed_days;
              departmentSMU.level_1_bed_days += department.level_1_bed_days;
              departmentSMU.level_2_bed_days += department.level_2_bed_days;
              departmentSMU.level_3_bed_days += department.level_3_bed_days;
            });

            // 将科室数据和汇总对象添加到结果对象中
            transformedData[departmentKey] = data[departmentKey];
            transformedData[`${departmentKey}SMU`] = departmentSMU;
          } else {
            // 如果不是数组，直接复制数据
            transformedData[departmentKey] = data[departmentKey];
          }
        }

        // 清空 areaDataQuarter 对象数组
        Object.entries(areaDataQuarter).forEach(([key, value]) => {
          areaDataQuarter[key] = [];
        });

        // 填充 areaDataQuarter 对象
        departments.forEach((department) => {
          const smuKey = `${department}SMU`;
          if (transformedData[smuKey]) {
            areaDataQuarter.住院患者实际占用床日数.push(transformedData[smuKey].actual_bed_days);
            areaDataQuarter.新入院患者总数.push(transformedData[smuKey].new_admissions_count);
            areaDataQuarter.白班责任护士数.push(transformedData[smuKey].day_shift_nurses);
            areaDataQuarter.白班护理患者数.push(transformedData[smuKey].day_shift_patients);
            areaDataQuarter.夜班责任护士数.push(transformedData[smuKey].night_shift_nurses);
            areaDataQuarter.夜班护理患者数.push(transformedData[smuKey].night_shift_patients);
            areaDataQuarter.护士上班小时数.push(transformedData[smuKey].nurse_work_hours);
            areaDataQuarter.导尿管留置日数.push(transformedData[smuKey].catheter_days);
            areaDataQuarter.胃肠管留置日数.push(transformedData[smuKey].astro_tube_days);
            areaDataQuarter.气管导管留置日数.push(transformedData[smuKey].trachea_tube_days);
            areaDataQuarter.CVC留置日数.push(transformedData[smuKey].cvc_days);
            areaDataQuarter.PICC留置日数.push(transformedData[smuKey].picc_days);
            areaDataQuarter.身体约束日数.push(transformedData[smuKey].restraint_days);
            areaDataQuarter.特级护理患者占用床日数.push(transformedData[smuKey].special_care_bed_days);
            areaDataQuarter.一级护理患者占用床日数.push(transformedData[smuKey].level_1_bed_days);
            areaDataQuarter.二级护理患者占用床日数.push(transformedData[smuKey].level_2_bed_days);
            areaDataQuarter.三级护理患者占用床日数.push(transformedData[smuKey].level_3_bed_days);
          } else {
            // 如果没有汇总数据，填充为 0 或其他默认值
            areaDataQuarter.住院患者实际占用床日数.push(0);
            areaDataQuarter.新入院患者总数.push(0);
            areaDataQuarter.白班责任护士数.push(0);
            areaDataQuarter.白班护理患者数.push(0);
            areaDataQuarter.夜班责任护士数.push(0);
            areaDataQuarter.夜班护理患者数.push(0);
            areaDataQuarter.护士上班小时数.push(0);
            areaDataQuarter.导尿管留置日数.push(0);
            areaDataQuarter.胃肠管留置日数.push(0);
            areaDataQuarter.气管导管留置日数.push(0);
            areaDataQuarter.CVC留置日数.push(0);
            areaDataQuarter.PICC留置日数.push(0);
            areaDataQuarter.身体约束日数.push(0);
            areaDataQuarter.特级护理患者占用床日数.push(0);
            areaDataQuarter.一级护理患者占用床日数.push(0);
            areaDataQuarter.二级护理患者占用床日数.push(0);
            areaDataQuarter.三级护理患者占用床日数.push(0);
          }
        });

        // 在每个数组的末尾添加前24个元素的总和
        for (const key in areaDataQuarter) {
          if (Array.isArray(areaDataQuarter[key])) {
            const sum = areaDataQuarter[key].slice(0, 24).reduce((acc, val) => acc + val, 0);
            areaDataQuarter[key].push(sum);
          }
        }

        return areaDataQuarter;
      }

      // 各科室 ***指标*** 按各个科室 统计 函数
      function departTargetQuarterFun(data, departments) {
        // 初始化聚合数据对象
        const aggregatedData = {
          实际开放床数: Array(departments.length).fill(0),
          初全院执业护士总人数: Array(departments.length).fill(0),
          末全院执业护士总人数: Array(departments.length).fill(0),
          初病区执业护士总人数: Array(departments.length).fill(0),
          末病区执业护士总人数: Array(departments.length).fill(0),
          岗执业护士上班小时数: Array(departments.length).fill(0),
          导尿管拔管发生例次数: Array(departments.length).fill(0),
          胃肠管拔管发生例次数: Array(departments.length).fill(0),
          中心导管拔管发生例次数: Array(departments.length).fill(0),
          气管导管拔管发生例次数: Array(departments.length).fill(0),
          VAP发生例次数: Array(departments.length).fill(0),
          CLABSI发生例次数: Array(departments.length).fill(0),
          CAUTI发生例次数: Array(departments.length).fill(0),
          有创机械通气的总日数: Array(departments.length).fill(0),
          住院患者身体约束日数: Array(departments.length).fill(0),
          II期及以上压疮发生例数: Array(departments.length).fill(0),
          I期压疮发生例数: Array(departments.length).fill(0),
          跌倒发生例次数: Array(departments.length).fill(0),
          跌倒伤害严重度1级例次数: Array(departments.length).fill(0),
          跌倒伤害严重度2级例次数: Array(departments.length).fill(0),
          跌倒伤害严重度3级例次数: Array(departments.length).fill(0),
          跌倒死亡例次数: Array(departments.length).fill(0),
          跌倒伤害总例次数: Array(departments.length).fill(0),
        };

        // 遍历每个科室
        departments.forEach((department, index) => {
          if (data[department]) {
            data[department].forEach((record) => {
              aggregatedData["实际开放床数"][index] += record.beds;
              aggregatedData["初全院执业护士总人数"][index] += record.total_nurses_start;
              aggregatedData["末全院执业护士总人数"][index] += record.total_nurses_end;
              aggregatedData["初病区执业护士总人数"][index] += record.ward_nurses_start;
              aggregatedData["末病区执业护士总人数"][index] += record.ward_nurses_end;
              aggregatedData["岗执业护士上班小时数"][index] += record.nurse_hours;
              aggregatedData["导尿管拔管发生例次数"][index] += record.catheter_count;
              aggregatedData["胃肠管拔管发生例次数"][index] += record.gastric_count;
              aggregatedData["中心导管拔管发生例次数"][index] += record.central_catheter_coun;
              aggregatedData["气管导管拔管发生例次数"][index] += record.tracheal_count;
              aggregatedData["VAP发生例次数"][index] += record.vap_count;
              aggregatedData["CLABSI发生例次数"][index] += record.clabsi_count;
              aggregatedData["CAUTI发生例次数"][index] += record.cauti_count;
              aggregatedData["有创机械通气的总日数"][index] += record.vent_days;
              aggregatedData["住院患者身体约束日数"][index] += record.restraint_days;
              aggregatedData["II期及以上压疮发生例数"][index] += record.stage2_ulcer;
              aggregatedData["I期压疮发生例数"][index] += record.stage1_ulcer;
              aggregatedData["跌倒发生例次数"][index] += record.falls_count;
              aggregatedData["跌倒伤害严重度1级例次数"][index] += record.falls_severity1;
              aggregatedData["跌倒伤害严重度2级例次数"][index] += record.falls_severity2;
              aggregatedData["跌倒伤害严重度3级例次数"][index] += record.falls_severity3;
              aggregatedData["跌倒死亡例次数"][index] += record.falls_death;
              aggregatedData["跌倒伤害总例次数"][index] += record.falls_injury;
            });
          }
        });

        // 在每个数组的末尾添加前24个元素的总和
        for (const key in aggregatedData) {
          if (Array.isArray(aggregatedData[key])) {
            const sum = aggregatedData[key].slice(0, 24).reduce((acc, val) => acc + val, 0);
            aggregatedData[key].push(sum);
          }
        }

        return aggregatedData;
      }

      // 添加空白行
      function addTwoEmptyRowsFun(tableId) {
        // 获取指定ID的表格元素
        var table = document.getElementById(tableId);
        // 创建一行
        var row = table.insertRow();
        // 设置行高为50px
        row.style.height = "40px";
        // 创建第一个单元格
        var cell1 = row.insertCell(0);
        cell1.innerHTML = ""; // 设置单元格内容为空
      }

      // 定义 tableAddFun 函数
      function tableAddFun(data, tableSelector, lastRowClass = false, lastColClass = false) {
        // 遍历 data 对象的每个键值对
        var rowIndex = 0; // 用于记录行索引
        for (var key in data) {
          if (data.hasOwnProperty(key)) {
            // 创建表格行
            var $tr = $("<tr>");
            $tr.append($("<td>").addClass("text-left").text(key)); // 使用键作为表格行的第一列
            // 获取数据数组
            var dataArray = data[key];
            // 遍历数据数组并添加到表格行中
            for (var i = 0; i < dataArray.length; i++) {
              var $td = $("<td>").addClass("text-center").text(dataArray[i]);
              // 如果是最后一列且 lastColClass 为 true，则添加 warning 类
              if (i === dataArray.length - 1 && lastColClass) {
                $td.addClass("warning");
              }
              $tr.append($td);
            }
            // 判断是否为偶数行，并添加相应的类
            if (rowIndex % 2 === 1) {
              $tr.addClass("info");
            }
            // 将表格行插入到指定的表格的 tbody 中
            $(`${tableSelector} tbody`).append($tr);
            // 增加行索引
            rowIndex++;
          }
        }

        // 如果需要添加 warning 类到最后一行，并且表格不为空
        if (lastRowClass && $(`${tableSelector} tbody tr`).length > 0) {
          $(`${tableSelector} tbody tr:last`).addClass("warning");
        }
      }
    },

    add: function () {
      Controller.api.bindevent();
    },

    edit: function () {
      Controller.api.bindevent();
    },

    api: {
      bindevent: function () {
        Form.api.bindevent($("form[role=form]"));
      },
    },
  };
  return Controller;
});
